#ifndef STACKTP_H_
#define STACKTP_H_

#include <iostream>

template <typename T>
class Stack
{
private:
    // 常量
    enum {MAX = 10}; 

    // 底层数据结构
    T items[MAX];    
    int top;

public:
    Stack();

    bool isempty();
    bool isfull();
    bool push(const T & item);
    bool pop(T & item);

    void show();

};

/* 不能将模板成员函数放在独立的实现文件里 */
template <typename T>
Stack<T>::Stack()
{
    top = 0;
}

template <typename T>
bool Stack<T>::isempty()
{
    return top == 0;
}

template <typename T>
bool Stack<T>::isfull()
{
    return top == MAX;
}

template <typename T>
bool Stack<T>::push(const T & item)
{
    if (isfull()) return false;

    items[top++] = item;
    return true;
}

template <typename T>
bool Stack<T>::pop(T & item)
{
    if (isempty()) return false;

    item = items[--top];    // !!! --top
    return true;
}

template <typename T>
void Stack<T>::show()
{
    for (int i = 0; i < top; ++ i)
        std::cout << " " << items[i];
    std::cout << std::endl;
}

#endif